#include "HistoryManager.h"
#include <nlohmann/json.hpp>
#include <fstream>
#include <filesystem>
#include <iostream>

using namespace std;

using json = nlohmann::json;

HistoryManager::HistoryManager() {}

std::vector<std::pair<std::string, std::string>> HistoryManager::loadHistory(const std::string& historyFile) {
    std::vector<std::pair<std::string, std::string>> history;
    std::ifstream file(historyFile);
    if (!file.is_open()) {
        std::cerr << "无法打开历史文件: " << historyFile << std::endl;
        return history;
    }

    json j;
    try {
        file >> j;
        for (const auto& turn : j) {
            std::string user = turn.value("user", ""); //默认值为空字符串
            std::string assistant = turn.value("assistant", ""); //默认值为空字符串
            history.emplace_back(user, assistant);
        }
    } catch (const std::exception& e) {
        std::cerr << "读取历史 JSON 出错: " << e.what() << std::endl;
    }

    return history;
}

void HistoryManager::saveTurn(const std::string& userMessage, const std::string& assistantReply, const std::string& historyFile) {
    json j;

    // 尝试读取已有的历史
    std::ifstream inFile(historyFile);
    if (inFile.is_open()) {
        try {
            inFile >> j;
        } catch (...) {
            j = json::array();  // 如果文件损坏，则新建空数组
        }
        inFile.close();
    }

    j.push_back({
        {"user", userMessage},
        {"assistant", assistantReply}
    });

    std::ofstream outFile(historyFile);
    if (!outFile.is_open()) {
        std::cerr << "无法写入历史文件: " << historyFile << std::endl;
        return;
    }

    outFile << j.dump(4);
}


void HistoryManager::createHistoryFile(const std::string& historyFile) {
    // 检查文件所在目录是否存在，不存在则创建
    auto dirPath = std::filesystem::path(historyFile).parent_path();
    if (!dirPath.empty() && !std::filesystem::exists(dirPath)) {
        try {
            std::filesystem::create_directories(dirPath);
        } catch (const std::exception& e) {
            std::cerr << "无法创建目录: " << dirPath << ", 错误: " << e.what() << std::endl;
            return;
        }
    }

    // 创建并写入空JSON数组
    std::ofstream file(historyFile);
    if (!file.is_open()) {
        std::cerr << "无法创建历史文件: " << historyFile << std::endl;
        return;
    }

    file << "[]";
    file.close();
    // std::cout << "成功创建历史文件: "  << std::endl; //<< historyFile
}

int HistoryManager::deleteEmptyJsonFile(const std::string& historyFile) {
    // 检查文件是否存在
    if (!std::filesystem::exists(historyFile)) {
        std::cerr << "文件不存在: " << historyFile << std::endl;
        return 0;
    }

    // 打开文件读取内容
    std::ifstream file(historyFile);
    if (!file.is_open()) {
        std::cerr << "无法打开文件: " << historyFile << std::endl;
        return 0;
    }

    std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
    file.close();

    // 检查内容是否为空 JSON
    if (content == "[]" || content == "{}") {
        // 删除文件
        if (std::filesystem::remove(historyFile)) {
            std::cout << "已删除空 JSON 文件: " << historyFile << std::endl;
            return 1;
        } else {
            std::cerr << "无法删除文件: " << historyFile << std::endl;
            return 2;
        }
    } else {
        std::cout << "文件不是空 JSON，保留文件: " << historyFile << std::endl;
        return 3;
    }
}

void HistoryManager::resetName(const std::string& filePath, const std::string& newName){
    // 构造原始文件路径
    std::filesystem::path originalPath(filePath);

    // 检查原始文件是否存在
    if (!std::filesystem::exists(originalPath)) {
        std::cerr << "文件不存在: " << filePath << std::endl;
        return;
    }

    // 构造新文件路径
    std::filesystem::path newFilePath = originalPath.parent_path() / newName;

    // 检查新文件名是否已经存在
    if (std::filesystem::exists(newFilePath)) {
        std::cerr << "新文件名已存在: " << newFilePath << std::endl;
        return;
    }

    // 重命名文件
    try {
        std::filesystem::rename(originalPath, newFilePath);
        std::cout << "文件已重命名为: " << newFilePath << std::endl;
    } catch (const std::exception& e) {
        std::cerr << "重命名文件时出错: " << e.what() << std::endl;
    }
}